%load_ext autoreload
%autoreload 2
import xarray as xr
import pandas as pd
import hvplot.pandas
import hvplot.xarray
varname = 'salinity'
ds = xr.open_mfdataset(f'../tests/data/m1_hello_schism/outputs/{varname}_*.nc', concat_dim='time', combine="nested",
data_vars='minimal', coords='minimal', compat='override')
ds
<xarray.Dataset>
Dimensions: (time: 144, nSCHISM_hgrid_node: 2639, nSCHISM_vgrid_layers: 11)
Coordinates:
* time (time) datetime64[ns] 1999-12-31T16:20:00 ... 2000-01-02T16:00:00
Dimensions without coordinates: nSCHISM_hgrid_node, nSCHISM_vgrid_layers
Data variables:
salinity (time, nSCHISM_hgrid_node, nSCHISM_vgrid_layers) float32 dask.array<chunksize=(72, 2639, 11), meta=np.ndarray>#!conda install -y -c cadwr-dms schimpy
import schimpy
from schimpy import schism_mesh
import holoviews as hv
from holoviews import opts, dim
import holoviews.operation.datashader as hd
from holoviews.operation.datashader import datashade, rasterize
import warnings
warnings.filterwarnings('ignore')
smesh = schism_mesh.read_mesh('../tests/data/m1_hello_schism/hgrid.gr3')
smesh.n_nodes(), smesh.n_edges(), smesh.n_elems()
(2639, 7274, 4636)
varname
'salinity'
nodes = pd.DataFrame(smesh.nodes,columns=['x','y','z'])
nodes
nodes[varname] = ds[varname].values[0,:,0]
trimesh = hv.TriMesh((smesh.elems, hv.Points(nodes, vdims=varname)))
trimesh = trimesh.opts(
opts.TriMesh(cmap='rainbow4', cnorm='eq_hist', colorbar=True, node_alpha=0, edge_alpha=0, edge_color=varname, filled=True, height=400,
inspection_policy='edges', tools=['hover'], width=400))
trimesh.nodes.data
| x | y | index | z | salinity | |
|---|---|---|---|---|---|
| 0 | 56000.00 | -10400.00 | 0 | 0.500000 | 3.364312e-02 |
| 1 | 55831.58 | -10400.00 | 1 | 0.500000 | 1.095413e-02 |
| 2 | 56000.00 | -10350.00 | 2 | 0.944444 | 2.154961e-02 |
| 3 | 55663.16 | -10400.00 | 3 | 0.500000 | 2.462938e-08 |
| 4 | 55831.58 | -10348.07 | 4 | 1.023290 | 5.119039e-03 |
| ... | ... | ... | ... | ... | ... |
| 2634 | 55831.58 | 10348.07 | 2634 | 1.023290 | 5.119046e-03 |
| 2635 | 55663.16 | 10400.00 | 2635 | 0.500000 | 2.464225e-08 |
| 2636 | 56000.00 | 10350.00 | 2636 | 0.944444 | 2.154963e-02 |
| 2637 | 55831.58 | 10400.00 | 2637 | 0.500000 | 1.095410e-02 |
| 2638 | 56000.00 | 10400.00 | 2638 | 0.500000 | 3.364312e-02 |
2639 rows × 5 columns
import datashader
def update(time=0, depth=0):
trimesh.nodes.data[varname] = ds[varname].values[time, :, depth]
return rasterize(trimesh, precompute=False, dynamic=True,
aggregator=datashader.mean(varname)).opts(
colorbar=True, cmap='rainbow4', # clim=(0,10),
width=600, tools=['hover'])
import panel as pn
pn.extension()
time_slider= pn.widgets.DiscreteSlider(name='Time',
options=dict(zip(ds.time.astype('str').values,
range(len(ds.time)))))
depth_slider= pn.widgets.Select(name='nSCHISM_vgrid_layers',
options=dict(zip(ds.nSCHISM_vgrid_layers.astype('str').values,
range(len(ds.nSCHISM_vgrid_layers)))))
slider_row = pn.Row(time_slider, depth_slider)
map_row = pn.Row(pn.bind(update, time=time_slider, depth=depth_slider))
dash = pn.Column(slider_row, map_row)
dash.servable(f'HelloSCHISM: {varname}')